package com.liujit.web.utils;

import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.liujit.common.constants.AuthConstant;
import com.liujit.common.constants.HeaderConstant;
import com.liujit.common.utils.ReqUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;

import java.nio.charset.Charset;
import java.util.List;

/**
 * @Description: JWT 工具类
 * @Author: liujun
 * @Date: 2021/6/28 1:12 下午
 */
@Slf4j
public class JwtUtil {

    /**
     * 获取负载
     *
     * @return
     * @author: liujun
     * @date: 2021/6/28 12:10 下午
     */
    public static JSONObject getJwtPayload() {
        String jwtPayload = ReqUtil.getHeader(HeaderConstant.PAYLOAD);
        JSONObject jsonObject = JSONUtil.parseObj(jwtPayload);
        return jsonObject;
    }

    /**
     * 获取用户id
     *
     * @return
     * @author: liujun
     * @date: 2021/7/4 10:13 上午
     */
    public static Long getUserId() {
        return getJwtPayload().getLong(AuthConstant.DETAILS_USER_ID);
    }

    /**
     * 获取用户id
     *
     * @return
     * @author: liujun
     * @date: 2021/7/4 10:13 上午
     */
    public static String getOrgCode() {
        return getJwtPayload().getStr(AuthConstant.DETAILS_ORG_CODE);
    }

    /**
     * 获取角色
     *
     * @return
     * @author: liujun
     * @date: 2021/6/28 1:19 下午
     */
    public static List<String> getRoles() {
        return getJwtPayload().get(AuthConstant.JWT_AUTHORITIES, List.class);
    }

    /**
     * 获取登录认证的客户端ID
     * <p>
     * 兼容两种方式获取Oauth2客户端信息（client_id、client_secret）
     * 方式一：client_id、client_secret放在请求路径中
     * 方式二：放在请求头（Request Headers）中的Authorization字段，且经过加密，例如 Basic Y2xpZW50OnNlY3JldA== 明文等于 client:secret
     *
     * @return
     */
    public static String getClientId() {
        String clientId = "";
        // 从请求头获取
        String basic = ReqUtil.getHeader(HeaderConstant.AUTHORIZATION);
        if (StrUtil.isNotBlank(basic) && basic.startsWith(AuthConstant.BASIC)) {
            basic = basic.replace(AuthConstant.BASIC, Strings.EMPTY);
            String basicPlainText = StrUtil.str(SecureUtil.decode(basic), Charset.forName("UTF-8"));
            // client:secret
            clientId = basicPlainText.split(":")[0];
        }
        return clientId;
    }
}
